1 package io.vavr.collection;
2
3 import io.vavr.Value;
4 import org.assertj.core.api.Assertions;
5 import org.junit.Test;
6
7 import java.math.BigDecimal;
8 import java.util.ArrayList;
9 import java.util.Spliterator;
10 import java.util.function.Function;
11 import java.util.function.Supplier;
12 import java.util.stream.Collector;
13
14 public class LinkedHashSetTest extends AbstractSetTest {
15
16 @Override
17 protected <T> Collector<T, ArrayList<T>, LinkedHashSet<T>> collector() {
18 return LinkedHashSet.collector();
19 }
20
21 @Override
22 protected <T> LinkedHashSet<T> empty() {
23 return LinkedHashSet.empty();
24 }
25
26 @Override
27 protected <T> LinkedHashSet<T> emptyWithNull() {
28 return empty();
29 }
30
31 @Override
32 protected <T> LinkedHashSet<T> of(T element) {
33 return LinkedHashSet.of(element);
34 }
35
36 @SuppressWarnings("varargs")
37 @SafeVarargs
38 @Override
39 protected final <T> LinkedHashSet<T> of(T... elements) {
40 return LinkedHashSet.of(elements);
41 }
42
43 @Override
44 protected boolean useIsEqualToInsteadOfIsSameAs() {
45 return false;
46 }
47
48 @Override
49 protected int getPeekNonNilPerformingAnAction() {
50 return 1;
51 }
52
53 @Override
54 protected <T> LinkedHashSet<T> ofAll(Iterable<? extends T> elements) {
55 return LinkedHashSet.ofAll(elements);
56 }
57
58 @Override
59 protected <T extends Comparable<? super T>> LinkedHashSet<T> ofJavaStream(java.util.stream.Stream<? extends T> javaStream) {
60 return LinkedHashSet.ofAll(javaStream);
61 }
62
63 @Override
64 protected LinkedHashSet<Boolean> ofAll(boolean... elements) {
65 return LinkedHashSet.ofAll(elements);
66 }
67
68 @Override
69 protected LinkedHashSet<Byte> ofAll(byte... elements) {
70 return LinkedHashSet.ofAll(elements);
71 }
72
73 @Override
74 protected LinkedHashSet<Character> ofAll(char... elements) {
75 return LinkedHashSet.ofAll(elements);
76 }
77
78 @Override
79 protected LinkedHashSet<Double> ofAll(double... elements) {
80 return LinkedHashSet.ofAll(elements);
81 }
82
83 @Override
84 protected LinkedHashSet<Float> ofAll(float... elements) {
85 return LinkedHashSet.ofAll(elements);
86 }
87
88 @Override
89 protected LinkedHashSet<Integer> ofAll(int... elements) {
90 return LinkedHashSet.ofAll(elements);
91 }
92
93 @Override
94 protected LinkedHashSet<Long> ofAll(long... elements) {
95 return LinkedHashSet.ofAll(elements);
96 }
97
98 @Override
99 protected LinkedHashSet<Short> ofAll(short... elements) {
100 return LinkedHashSet.ofAll(elements);
101 }
102
103 @Override
104 protected <T> LinkedHashSet<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
105 return LinkedHashSet.tabulate(n, f);
106 }
107
108 @Override
109 protected <T> LinkedHashSet<T> fill(int n, Supplier<? extends T> s) {
110 return LinkedHashSet.fill(n, s);
111 }
112
113 @Override
114 protected LinkedHashSet<Character> range(char from, char toExclusive) {
115 return LinkedHashSet.range(from, toExclusive);
116 }
117
118 @Override
119 protected LinkedHashSet<Character> rangeBy(char from, char toExclusive, int step) {
120 return LinkedHashSet.rangeBy(from, toExclusive, step);
121 }
122
123 @Override
124 protected LinkedHashSet<Double> rangeBy(double from, double toExclusive, double step) {
125 return LinkedHashSet.rangeBy(from, toExclusive, step);
126 }
127
128 @Override
129 protected LinkedHashSet<Integer> range(int from, int toExclusive) {
130 return LinkedHashSet.range(from, toExclusive);
131 }
132
133 @Override
134 protected LinkedHashSet<Integer> rangeBy(int from, int toExclusive, int step) {
135 return LinkedHashSet.rangeBy(from, toExclusive, step);
136 }
137
138 @Override
139 protected LinkedHashSet<Long> range(long from, long toExclusive) {
140 return LinkedHashSet.range(from, toExclusive);
141 }
142
143 @Override
144 protected LinkedHashSet<Long> rangeBy(long from, long toExclusive, long step) {
145 return LinkedHashSet.rangeBy(from, toExclusive, step);
146 }
147
148 @Override
149 protected LinkedHashSet<Character> rangeClosed(char from, char toInclusive) {
150 return LinkedHashSet.rangeClosed(from, toInclusive);
151 }
152
153 @Override
154 protected LinkedHashSet<Character> rangeClosedBy(char from, char toInclusive, int step) {
155 return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
156 }
157
158 @Override
159 protected LinkedHashSet<Double> rangeClosedBy(double from, double toInclusive, double step) {
160 return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
161 }
162
163 @Override
164 protected LinkedHashSet<Integer> rangeClosed(int from, int toInclusive) {
165 return LinkedHashSet.rangeClosed(from, toInclusive);
166 }
167
168 @Override
169 protected LinkedHashSet<Integer> rangeClosedBy(int from, int toInclusive, int step) {
170 return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
171 }
172
173 @Override
174 protected LinkedHashSet<Long> rangeClosed(long from, long toInclusive) {
175 return LinkedHashSet.rangeClosed(from, toInclusive);
176 }
177
178 @Override
179 protected LinkedHashSet<Long> rangeClosedBy(long from, long toInclusive, long step) {
180 return LinkedHashSet.rangeClosedBy(from, toInclusive, step);
181 }
182
183 @Test
184 public void shouldKeepOrder() {
185 final List<Integer> actual = LinkedHashSet.<Integer> empty().add(3).add(2).add(1).toList();
186 assertThat(actual).isEqualTo(List.of(3, 2, 1));
187 }
188
189
190
191 @Test
192 public void shouldNarrowLinkedHashSet() {
193 final LinkedHashSet<Double> doubles = of(1.0d);
194 final LinkedHashSet<Number> numbers = LinkedHashSet.narrow(doubles);
195 final int actual = numbers.add(new BigDecimal("2.0")).sum().intValue();
196 assertThat(actual).isEqualTo(3);
197 }
198
199
200
201 @Test
202 public void shouldReturnSameInstanceIfReplacingNonExistingElement() {
203 final Set<Integer> set = LinkedHashSet.of(1, 2, 3);
204 final Set<Integer> actual = set.replace(4, 0);
205 assertThat(actual).isSameAs(set);
206 }
207
208 @Test
209 public void shouldPreserveOrderWhenReplacingExistingElement() {
210 final Set<Integer> set = LinkedHashSet.of(1, 2, 3);
211 final Set<Integer> actual = set.replace(2, 0);
212 final Set<Integer> expected = LinkedHashSet.of(1, 0, 3);
213 assertThat(actual).isEqualTo(expected);
214 Assertions.assertThat(List.ofAll(actual)).isEqualTo(List.ofAll(expected));
215 }
216
217 @Test
218 public void shouldPreserveOrderWhenReplacingExistingElementAndRemoveOtherIfElementAlreadyExists() {
219 final Set<Integer> set = LinkedHashSet.of(1, 2, 3, 4, 5);
220 final Set<Integer> actual = set.replace(2, 4);
221 final Set<Integer> expected = LinkedHashSet.of(1, 4, 3, 5);
222 assertThat(actual).isEqualTo(expected);
223 Assertions.assertThat(List.ofAll(actual)).isEqualTo(List.ofAll(expected));
224 }
225
226 @Test
227 public void shouldReturnSameInstanceWhenReplacingExistingElementWithIdentity() {
228 final Set<Integer> set = LinkedHashSet.of(1, 2, 3);
229 final Set<Integer> actual = set.replace(2, 2);
230 assertThat(actual).isSameAs(set);
231 }
232
233
234
235 @Test
236 public void shouldTransform() {
237 final String transformed = of(42).transform(v -> String.valueOf(v.get()));
238 assertThat(transformed).isEqualTo("42");
239 }
240
241
242
243 @Test
244 public void shouldReturnSelfOnConvertToLinkedSet() {
245 final Value<Integer> value = of(1, 2, 3);
246 assertThat(value.toLinkedSet()).isSameAs(value);
247 }
248
249
250
251 @Test
252 public void shouldNotHaveSortedSpliterator() {
253 assertThat(of(1, 2, 3).spliterator().hasCharacteristics(Spliterator.SORTED)).isFalse();
254 }
255
256 @Test
257 public void shouldHaveOrderedSpliterator() {
258 assertThat(of(1, 2, 3).spliterator().hasCharacteristics(Spliterator.ORDERED)).isTrue();
259 }
260
261
262
263 @Test
264 public void shouldReturnTrueWhenIsSequentialCalled() {
265 assertThat(of(1, 2, 3).isSequential()).isTrue();
266 }
267
268 }